package br.com.beautycenter.DAO;

import br.com.beautycenter.bean.Cliente;
import br.com.beautycenter.bean.PacoteTratamento;
import br.com.beautycenter.hibernateUtil.DaoBase;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Query;

public class PersisteCliente extends DaoBase<Cliente> {
    
    public List<Cliente> retornarClientes(){
        try {
            return findAll();
        } catch (Exception ex) {
            return new ArrayList<Cliente>();
        }
    }
    
    public void atualizarMysql(){
        refresh();
    }
    
    public List retornarClientesAtivos(){
        Query query = getEntityManager().createQuery("FROM Cliente f WHERE f.ativo=:ativo");
        query.setParameter("ativo", true);
        
        try{
            return query.getResultList();
        }catch(Exception ex){
            return new ArrayList<Cliente>();
        }
    }
    
    public Cliente retornarClientePeloID(Cliente paciente){
        return getEntityManager().find(Cliente.class, paciente.getIdPessoa());
    }
    
    public List<Cliente> retornarClientePeloNome(Cliente paciente){
        Query query = getEntityManager().createQuery("FROM Cliente p WHERE p.nome LIKE :nome");
        query.setParameter("nome", "%"+paciente.getNome()+"%");
        
        try{
           return query.getResultList(); 
        }catch(Exception ex){
            return new ArrayList<Cliente>();
        }
    }
    
    public Cliente retornarPacientePeloCPF(Cliente paciente){
        Query query = getEntityManager().createQuery("FROM Cliente p WHERE p.cpf=:cpf");
        query.setParameter("cpf", paciente.getCpf());
        
        try{
            return (Cliente) query.getSingleResult();
        }catch(Exception ex){
            return null;
        }
    }
    public int retornarMaxID(){
        Query query = getEntityManager().createQuery("SELECT MAX(p.idPessoa) FROM Cliente p");
        
        try{
            return Integer.valueOf(query.getSingleResult().toString());
        }catch (Exception ex){
            return 0;
        }
    }
     
    public void salvar(Cliente paciente){
        save(paciente);
    }
    
    public void atualizar(Cliente paciente){
        update(paciente);
    }
    
    /**
     * Percorre a lista de todos os pacotes para um determinado cliente e faz o somatório do crédito, que pode ser negativo.
     * @param cliente 
     */
    public void atualizarCreditoCliente(Cliente cliente){
        cliente = retornarClientePeloID(cliente);
        
        double credito = 0;
        
        //percorre todos os pacotes de tratamento desse cliente...
        for(PacoteTratamento item: cliente.getListaPacotesTratamento()){
            credito += (item.getTotalPago() - item.getTotalPacote());
        }
        
        cliente.setCredito(credito);
        atualizar(cliente);
    }
    
}
